package com.stonedt.spider.scheduled;

import com.stonedt.spider.service.SpiderFlowService;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 爬虫定时执行管理
 *
 * @author Administrator
 */
@Component
@Resource
public class SpiderJobManager {

    private static Logger logger = LoggerFactory.getLogger(SpiderJobManager.class);

    private final static String JOB_NAME = "SPIDER_TASK_";

    public final static String JOB_PARAM_NAME = "SPIDER_FLOW";

    //用来存储待执行的爬虫
//    public volatile static Map<String, Map<Integer, Map<String, Object>>> spiderList = new ConcurrentHashMap<>();

    public volatile static List<String> cronList = new ArrayList<String>();
    
    @Autowired
    private SpiderFlowService spiderFlowService;


    /**
     * 调度器
     */
    private Scheduler scheduler;

    {
        try {
            scheduler = new StdSchedulerFactory().getScheduler();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    //@PostConstruct
    public void initSpiderJob() {
    	if(!SpiderJob.SPIDERJOBSTATUS){
			return;
		}
        //查询所有开启定时任务的爬虫
//        List<Map<String, Object>> selectList = spiderFlowService.selectSpiderListJob();
    	cronList = spiderFlowService.selectSpiderListJob();
//        for (Map<String, Object> map : selectList) {
////        	System.out.println(JSONObject.toJSONString(map));
//            if (map.get("cron") != null) {
//                //通过cron判断该分组是否存在
//                Map<Integer, Map<String, Object>> cron = spiderList.get(map.get("cron"));
//                //分组不存在
//                if (cron == null) {
//                    cron = new ConcurrentHashMap<>();
//                }
//                cron.put(Integer.parseInt(map.get("id").toString()), map);
//                spiderList.put(map.get("cron").toString(), cron);
//            }
//        }
        //添加定时任务
        for (String cron : cronList) {
        	if(cron.equals("0 20 0/2 * * ?")){
        		addJob("0 30 9-22/4 * * ?");
        	}else{
        		addJob(cron);
        	}
        }
    }

    /**
     * 新建定时任务
     *
     * @param cron 表达式
     * @return boolean true/false
     */
    public Date addJob(String cron) {
        try {
        	if(!SpiderJob.SPIDERJOBSTATUS){
    			return null;
    		}
            JobDetail job = JobBuilder.newJob(SpiderJob.class).withIdentity(getJobKey(cron)).build();
            job.getJobDataMap().put(JOB_PARAM_NAME, cron);

            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing();

            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(cron)).withSchedule(cronScheduleBuilder).build();

            Date date = scheduler.scheduleJob(job, trigger);
            scheduler.start();
            return date;
        } catch (SchedulerException e) {
            logger.error("创建定时任务出错", e);
            return null;
        }
    }


    private JobKey getJobKey(String id) {
        return JobKey.jobKey(JOB_NAME + id);
    }

    private TriggerKey getTriggerKey(String id) {
        return TriggerKey.triggerKey(JOB_NAME + id);
    }


    public boolean remove(String id) {
        try {
            scheduler.deleteJob(getJobKey(id));
//            spiderList.remove(id);
            return true;
        } catch (SchedulerException e) {
            logger.error("删除定时任务失败", e);
            return false;
        }
    }

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 10:24
//     * 传入一个cron 表达式 判断是否在内存中   不存在 默认 不运行
//     * @since
//     */
//    public boolean isJobRun(String cron) {
//        Map<Integer, Map<String, Object>> run = spiderList.get(cron);
//
//        if (run != null) {
//            return true;
//        }
//        return false;
//    }

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 10:39
//     * 将传过来的spiderflow对象放到内存里面
//     * @since Map<String, List < Map < Integer, Map < String, Object>>>>
//     */
//    public boolean addList(SpiderFlow spiderFlow) {
//        try {
//        	if(!SpiderJob.SPIDERJOBSTATUS){
//    			return false;
//    		}
//            String jsonString = JSONObject.toJSONString(spiderFlow);
////            System.out.println(jsonString);
//            Map<String, Object> map = JSONObject.parseObject(jsonString, Map.class);
//            Map<Integer, Map<String, Object>> run = spiderList.get(spiderFlow.getCron());
//            if (run == null) {
//                run = new ConcurrentHashMap<>();
//            }
////            System.out.println(JSONObject.toJSONString(map));
//            run.put(spiderFlow.getId(), map);
//            spiderList.put(spiderFlow.getCron(), run);
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//
//    }

//    public boolean addList(Map<String, Object> spiderFlow) {
//        try {
//        	if(!SpiderJob.SPIDERJOBSTATUS){
//    			return false;
//    		}
//            Map<Integer, Map<String, Object>> run = spiderList.get(spiderFlow.get("cron"));
//            if (run == null) {
//                run = new ConcurrentHashMap<>();
//            }
//            run.put((Integer) spiderFlow.get("id"), spiderFlow);
//            spiderList.put(spiderFlow.get("cron").toString(), run);
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 10:46
//     * 删除内存中的spiderFlow对象
//     * @since
//     */
//    public boolean removeList(int id, String cron) {
//        try {
//            if (spiderList == null || spiderList.size() == 0) {
//                return true;
//            }
//            Map<Integer, Map<String, Object>> maps = spiderList.get(cron);
//            if (maps == null || maps.size() == 0) {
//                return true;
//            }
//            maps.remove(id);
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 11:03
//     * 判断内存中是否存在spideflow配置
//     * @since
//     */
//    public boolean isList(int id, String cron) {
//
//        Map<Integer, Map<String, Object>> maps = spiderList.get(cron);
//        if (maps == null)
//            return false;
//
//        Map<String, Object> map = maps.get(id);
//        if (map == null) return false;
//        return true;
//
//    }

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 11:13
//     * 判断cron表达式在内存中是否还有配置
//     * @since
//     */
//    public boolean isListHave(String cron) {
//        Map<Integer, Map<String, Object>> maps = spiderList.get(cron);
//
//        if (maps == null || maps.size() == 0)
//            return false;
//
//        return true;
//    }
}
